package com.dayuanit.dy17.mix.proxy.dynamicproxy;

import com.dayuanit.dy17.mix.proxy.annotaion.Transactional;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 模拟事务的代理逻辑
 */
public class TransactionalInvocationHandler implements InvocationHandler {
    private Object target;

    public TransactionalInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;

        //由于事务的注解是在实现中，也就是目标类中，所以，就拿接口的method对象到target中获取目标方法对象，才能找到事务的注解。
        Transactional annotation = target.getClass().getMethod(method.getName(), method.getParameterTypes()).getAnnotation(Transactional.class);

        //由于此method对象是接口中定义的，接口的方法上木有事务注解，所以无法获取注解对象。
        //Transactional annotation = method.getAnnotation(Transactional.class);

        //如果木有事务注解，则不代理
        if (null == annotation) {
            //直接调用目标方法
            result = method.invoke(target, args);
            return result;
        }

        System.out.println("开启事务...");

        try {
            //调用目标方法
            result = method.invoke(target, args);
            System.out.println("提交事务");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("回滚事务");
        }

        return result;
    }
}
